JSON Web Tokens
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.
JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA. JWTはparty間での秘密にするために暗号化することもできるが、署名付きトークンにフォーカスする
署名付きトークンと暗号化トークンがある
署名付きトークン(signed token)は、それ含まれるclaim(属性情報)の正確さを保証できる
一方、暗号化トークン(encrypted token)は他のpartyからきたclaimを隠す
トークンが公開/秘密鍵のペアで署名されていたとき、シグネチャはそのパーティのみが、署名した秘密鍵を保持していることを保証する
トークンに必要な情報は全てJWTが持っている(stateless)はずkadoyau.icon
何に使う?
This is the most common scenario for using JWT. Once the user is logged in, each subsequent request will include the JWT, allowing the user to access routes, services, and resources that are permitted with that token. Single Sign On is a feature that widely uses JWT nowadays, because of its small overhead and its ability to be easily used across different domains. Information Exchange
「送信者の確認」と「改ざんの検知」ができる
JSON Web Tokens are a good way of securely transmitting information between parties. Because JWTs can be signed—for example, using public/private key pairs—you can be sure the senders are who they say they are. Additionally, as the signature is calculated using the header and the payload, you can also verify that the content hasn't been tampered with.
活用事例
header, payload, signature
共通フィールド
subject
issuer
expiration time
改ざんされなくなるようにトークンの コンテンツを検証する機能 (JWS)
クライアントに対して 不透明さ を維持できるように 情報を暗号化 する機能(JWT)
session管理には使うのはメリットがなさそう
たとえばAmazonの買い物カゴみたいなのをJWTで作るのはかなり面倒では。
OIDC(Authz)ではネット越しに認可の基盤と通信するがレスポンスが長い アクセス権などをAuthzサーバで秘密鍵で署名してクライアントに発行するトークン
クライアントはAPIリクエスト時にトークンを渡すと、APIサーバは公開鍵で改竄検知をして信頼する
JWTは署名付きのペイロードを持てるのでこの実装に使える JWTの場合場合statelessになる
statelessなので、流出した場合に古いアクセストークンを無効化する方法が限られる
ブラックリストを作る(どうやって?)
期限切れまで待つ(なすすべなし)
秘密鍵を変える(相当手間)
なのでexpireは短く指定する
クライアントがアクセス権を発行してもらうときにAuthzサーバに送るトークン
statefull
流出してもサーバーサイドで破棄できる